package it.ap.sa.acqua.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StopWatch;

import it.ap.sa.acqua.dao.model.TAssTankPlant;
import it.ap.sa.core.dao.util.AbstractGenericEntityDao;
import it.ap.sa.core.utils.LogUtil;
/**
 * @author Alessandro Paolillo
 */
@Repository
public class TAssTankPlantDao  extends AbstractGenericEntityDao<TAssTankPlant>{

	/** logger **/
	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	/**
	 * Il metodo recupera il pesce con id passato come input
	 * @param long id : id del pesce da recuperare
	 * @return TAssTankPlant : pesce recuperato
	 * @throws Exception
	 */
	@Transactional
	public TAssTankPlant findByPk(long id) throws Exception{
		try{
			String  hql     = "from " + TAssTankPlant.class.getName() + " where id = :id";
			Session session = this.getSessionFactory().getCurrentSession();
			Query   query   = session.createQuery(hql);

			query.setLong("id", id);

			return (TAssTankPlant)query.uniqueResult();
		}catch(Exception e){
			if(logger.isDebugEnabled())
				logger.debug("Error in findByPk", e);
			throw e;
		}
	}
	
	/**
	 * Il metodo si occupa del recupero di tutti i pesci dal db con id passati come parametro
	 * @param List<Long> ids : id dei pesci da recuperare
	 * @return List<TAssTankPlant> : lista di pesci con id passati come parametri di ingresso
	 * @throws Exception
	 */
	public List<TAssTankPlant> findByPks(List<Long> ids) throws Exception{
		try{
			String  hql     = "from " + TAssTankPlant.class.getName() + " where id in (:ids)";
			Session session = this.getSessionFactory().getCurrentSession();
			Query   query   = session.createQuery(hql);

			query.setParameterList("ids", ids);

			return query.list();
		}catch(Exception e){
			if(logger.isDebugEnabled())
				logger.debug("Error in findByPks", e);
			throw e;
		}
	}
	
	/**
	 * Il metodo si occupa del recupero di tutti i pesci dal db con id passati come parametro
	 * @param List<Long> ids : id dei pesci da recuperare
	 * @return List<TAssTankPlant> : lista di pesci con id passati come parametri di ingresso
	 * @throws Exception
	 */
	public List<TAssTankPlant> findByIdTank(Long idTank) throws Exception{
		try{
			String  hql     = "from " + TAssTankPlant.class.getName() + " where id_tank = :idTank";
			Session session = this.getSessionFactory().getCurrentSession();
			Query   query   = session.createQuery(hql);

			query.setLong("idTank", idTank);

			return query.list();
		}catch(Exception e){
			if(logger.isDebugEnabled())
				logger.debug("Error in findByIdTank", e);
			throw e;
		}
	}
	
	/**
	 * Il metodo si occupa del salvataggio di un pesce nel db
	 * @author Alessandro Paolillo
	 * @param {@link TAssTankPlant} tAssTankFish : pesce da salvare nel db
	 * @return TAssTankPlant :pesce salvato nel db
	 * @throws Exception
	 */
	@Transactional
	public TAssTankPlant saveOrUpdate(TAssTankPlant tAssTankFish) throws Exception {

		String    idLog     = "saveOrUpdate";
		StopWatch stopWatch = LogUtil.startStopWatch(idLog);
		logger.info(idLog);
		try {
			saveEntity(tAssTankFish);
		} catch (Exception ex) {

			logger.error("Si è verificato un errore in saveOrUpdate: " + ex.getMessage() , ex);
			throw(ex);
		} finally{

			logger.info(LogUtil.endStopWatch(stopWatch));
		}
		return tAssTankFish;
	}
	
	/**
	 */
	@Transactional
	public void deleteByLivestockId(Long plantId) throws Exception {

		String    idLog     = "deleteByLivestockId";
		StopWatch stopWatch = LogUtil.startStopWatch(idLog);
		logger.info(idLog);
		try {
			
			String sql = "DELETE FROM "+TAssTankPlant.class.getName()+" WHERE id_plant = :plantId";
			Session session = this.getSessionFactory().getCurrentSession();
			Query   query   = session.createQuery(sql);
			query.setLong("plantId"			,plantId);
			query.executeUpdate();
		} catch (Exception ex) {

			logger.error("Si è verificato un errore in deleteByLivestockId: " + ex.getMessage() , ex);
			throw(ex);
		} finally{

			logger.info(LogUtil.endStopWatch(stopWatch));
		}
	}
	
	
}
